home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / PluginSRC_EvenMore / Troff2Text.e < prev    next >
Text File  |  2002-03-12  |  14KB  |  595 lines

  1. /*
  2.    Troff2Text
  3.    EvenMore FileIO plugin
  4.    Author: Chris Perver
  5.    Copyright (c) 2001
  6. */
  7.  
  8.  
  9. OPT REG=5
  10.  
  11. LIBRARY 'troff2text.plugin',1,1,'Troff2Text 1.01' IS em_main, em_end, em_info, em_pluginid, em_begin, em_format
  12.  
  13. MODULE 'tools/ctype', '*epo'
  14.  
  15. DEF mem2:PTR TO CHAR, count2 =0
  16. DEF ital      = 1,
  17.     bold      = 2,
  18.     italbold  = 3,
  19.     roman     = 4
  20.  
  21. PROC em_isdatatype(bf, bl)
  22.   DEF pos = 0, rs = FALSE, working = TRUE
  23.  
  24.   WHILE working
  25.     IF Long(bf + pos) = ".TH "
  26.       working := FALSE
  27.       rs :=  TRUE
  28.     ENDIF
  29.  
  30.     WHILE bf[pos] <> "\n"
  31.       INC pos
  32.     ENDWHILE
  33.  
  34.     INC pos
  35.  
  36.     IF pos >= bl THEN working := FALSE
  37.   ENDWHILE
  38. ENDPROC rs
  39.  
  40. PROC setfontstyle(fs)
  41.   SELECT fs
  42.     CASE bold
  43.       mem2[count2++] := "\e"
  44.       mem2[count2++] := "["
  45.       mem2[count2++] := "1"
  46.       mem2[count2++] := "m"
  47.     CASE ital
  48.       mem2[count2++] := "\e"
  49.       mem2[count2++] := "["
  50.       mem2[count2++] := "3"
  51.       mem2[count2++] := "m"
  52.     CASE italbold
  53.       mem2[count2++] := "\e"
  54.       mem2[count2++] := "["
  55.       mem2[count2++] := "1"
  56.       mem2[count2++] := ";"
  57.       mem2[count2++] := "3"
  58.       mem2[count2++] := "m"
  59.     CASE roman
  60.       mem2[count2++] := "\e"
  61.       mem2[count2++] := "["
  62.       mem2[count2++] := "0"
  63.       mem2[count2++] := "m"
  64.   ENDSELECT
  65. ENDPROC
  66.  
  67. PROC em_parsedata(epo:PTR TO em_pluginobj)
  68.  
  69.   DEF memadr:PTR TO CHAR, lenadr, len2
  70.   DEF count = 0
  71.   DEF notdone = TRUE
  72.  
  73.   DEF man[256]:STRING, wordwrap = 80, cchar = 0, ww = TRUE, oldpos = 0, i, j
  74.  
  75.   DEF laststyle = 0
  76.   DEF style     = 0
  77.   DEF isbreak   = 0
  78.  
  79.  
  80.   memadr := epo.buffer
  81.   lenadr := epo.length
  82.  
  83.   mem2 := epo.nbuffer
  84.   len2 := epo.nlength
  85.  
  86.   mem2[len2] := "\n"
  87.  
  88.   WHILE notdone AND (count < lenadr)
  89.     SELECT 256 OF memadr[count]
  90.  
  91.       -> FORMATING
  92.       CASE $5C
  93.         i := count
  94.         WHILE memadr[i] <> "\n" DO INC i
  95.         INC i
  96.  
  97.         StrCopy(man, memadr + count, 10)
  98.  
  99.         SELECT 256 OF memadr[count+1]
  100.           CASE "*"
  101.             SELECT 256 OF memadr[count+2]
  102.  
  103.               -> SPECIAL
  104.               CASE "("
  105.                 -> TRADEMARK
  106.                 IF InStr(man, '*(Tm') = 1
  107.                   count := count + 3
  108.  
  109.                  -> QUOTES
  110.                 ELSEIF InStr(man, '*(L"') = 1
  111.                   count := count + 4
  112.                 ELSEIF InStr(man, '*(R"') = 1
  113.                   count := count + 4
  114.  
  115.                 -> QUOTES
  116.                 ELSEIF InStr(man, '*(lq') = 1
  117.                   mem2[count2++] := $22
  118.  
  119.                   INC cchar
  120.                   count := count + 5
  121.                 ELSEIF InStr(man, '*(rq') = 1
  122.                   mem2[count2++] := $22
  123.  
  124.                   INC cchar
  125.                   count := count + 5
  126.  
  127.                 ELSE
  128.                   mem2[count2++] := memadr[count++]
  129.                   INC cchar
  130.                 ENDIF
  131.  
  132.               -> DEFAULT FONT SIZE
  133.               CASE "S"
  134.                 count := count + 3
  135.  
  136.               -> (R)
  137.               CASE "R"
  138.                 mem2[count2++] := $ae
  139.                 INC cchar
  140.  
  141.                 count := count + 3
  142.               DEFAULT
  143.                 count := count + 3
  144.             ENDSELECT
  145.  
  146.  
  147.  
  148.           -> NON SPACE CHAR
  149.           CASE "&"
  150.             count := count + 2
  151.  
  152.           -> COMMENT
  153.           CASE $22
  154.             count := i
  155.  
  156.           -> SIZE
  157.           CASE "s"
  158.             SELECT 256 OF memadr[count + 2]
  159.               CASE "-"
  160.                 count := count + 4
  161.               DEFAULT
  162.                 count := count + 3
  163.              ENDSELECT
  164.  
  165.           -> STYLE
  166.           CASE "f"
  167.             SELECT 256 OF memadr[count + 2]
  168.               CASE "I"
  169.                 laststyle := style
  170.                 style := ital
  171.                 setfontstyle(style)
  172.  
  173.                 count := count + 3
  174.               CASE "B"
  175.                 laststyle := style
  176.                 style := bold
  177.                 setfontstyle(style)
  178.  
  179.                 count := count + 3
  180.               CASE "R"
  181.                 laststyle := style
  182.                 style := roman
  183.                 setfontstyle(style)
  184.  
  185.                 count := count + 3
  186.               DEFAULT
  187.                 INC cchar
  188.                 mem2[count2++] := memadr[count++]
  189.             ENDSELECT
  190.  
  191.  
  192.           DEFAULT
  193.             INC cchar
  194.             mem2[count2++] := memadr[count++]
  195.         ENDSELECT
  196.  
  197.       -> LF
  198.       CASE "\n", "\b"
  199.  
  200.         IF isspace(memadr[count-1]) = FALSE THEN mem2[count2++] := " "
  201.         INC count
  202.         SELECT isbreak
  203.           -> Font revert
  204.           CASE 2
  205.             style := roman ->laststyle
  206.             setfontstyle(style)
  207.             isbreak := 0
  208.           -> Line break
  209.           CASE 1
  210.             mem2[count2++] := "\n"
  211.             isbreak := 0
  212.             cchar := 0
  213.         ENDSELECT
  214.  
  215.       -> COMMAND
  216.       CASE "."
  217.  
  218.         -> GET END OF COMMAND
  219.  
  220.         i := count
  221.         WHILE memadr[i] <> "\n" DO INC i
  222.         INC i
  223.  
  224.  
  225.         StrCopy(man, memadr + count, 10)
  226.  
  227.         SELECT 256 OF memadr[count + 1]
  228.  
  229.           CASE "b"
  230.             IF InStr(man, '.bp') = 0
  231.               mem2[count2++] := "\n"
  232.               mem2[count2++] := "\n"
  233.  
  234.               cchar := 0
  235.               count := i
  236.  
  237.             -> LINE BREAK
  238.             ELSEIF InStr(man, '.br') = 0
  239.               mem2[count2++] := "\n"
  240.  
  241.               cchar := 0
  242.               count := i
  243.             ELSE
  244.               mem2[count2++] := memadr[count++]
  245.               INC cchar
  246.             ENDIF
  247.  
  248.           CASE "B"
  249.             IF InStr(man, '.B ') = 0
  250.               laststyle := style
  251.               style := bold
  252.               setfontstyle(bold)
  253.  
  254.               j := count + 1
  255.               WHILE memadr[j] = " " DO INC j
  256.               IF memadr[j] <> "\n" THEN isbreak := 2
  257.  
  258.               count := count + 3
  259.             ELSEIF InStr(man, '.BI ') = 0
  260.               laststyle := style
  261.               style := italbold
  262.               setfontstyle(style)
  263.  
  264.               j := count + 1
  265.               WHILE memadr[j] = " " DO INC j
  266.               IF memadr[j] <> "\n" THEN isbreak := 2
  267.  
  268.               count := count + 4
  269.             ELSEIF InStr(man, '.BR ') = 0
  270.               laststyle := style
  271.               style := bold
  272.               setfontstyle(style)
  273.  
  274.               j := count + 1
  275.               WHILE memadr[j] = " " DO INC j
  276.               IF memadr[j] <> "\n" THEN isbreak := 2
  277.  
  278.               count := count + 4
  279.             -> LINE BREAK
  280.             ELSEIF InStr(man, '.BR') = 0
  281.               mem2[count2++] := "\n"
  282.  
  283.               cchar := 0
  284.               count := i
  285.             ELSE
  286.               mem2[count2++] := memadr[count++]
  287.               INC cchar
  288.             ENDIF
  289.  
  290.           -> MACRO
  291.           CASE "d"
  292.             IF InStr(man, '.de') = 0
  293.               WHILE memadr[count] <> "\n"
  294.                 INC count
  295.  
  296.                 EXIT (memadr[count] = "." AND memadr[count+1] = ".")
  297.               ENDWHILE
  298.             ELSE
  299.               mem2[count2++] := memadr[count++]
  300.               INC cchar
  301.             ENDIF
  302.  
  303.           CASE "D"
  304.             -> SET TAB SIZES
  305.             IF InStr(man, '.DT') = 0
  306.               count := i
  307.             ELSE
  308.               mem2[count2++] := memadr[count++]
  309.               INC cchar
  310.             ENDIF
  311.  
  312.           CASE "f"
  313.             IF InStr(man, '.ft') = 0
  314.               IF memadr[count + 2] = " "
  315.                 style := laststyle
  316.               ELSE
  317.  
  318.                 SELECT 256 OF memadr[count+3]
  319.                   CASE "B"
  320.                     IF memadr[count+4] <> "I"
  321.  
  322.                       laststyle := style
  323.                       style := bold
  324.                       setfontstyle(style)
  325.  
  326.                       count := i
  327.                     ELSE
  328.  
  329.                       laststyle := style
  330.                       style := italbold
  331.                       setfontstyle(style)
  332.  
  333.                       count := i
  334.                     ENDIF
  335.                   CASE "I"
  336.  
  337.                     laststyle := style
  338.                     style := ital
  339.                     setfontstyle(style)
  340.  
  341.                     count := i
  342.                   CASE "R"
  343.                     count := i
  344.                   DEFAULT
  345.                     count := i
  346.  
  347.                 ENDSELECT
  348.               ENDIF
  349.             ELSE
  350.               mem2[count2++] := memadr[count++]
  351.               INC cchar
  352.             ENDIF
  353.  
  354.           CASE "I"
  355.             IF InStr(man, '.I ') = 0
  356.               laststyle := style
  357.               style     := ital
  358.               setfontstyle(style)
  359.  
  360.               j := count + 1
  361.               WHILE memadr[j] = " " DO INC j
  362.               IF memadr[j] <> "\n" THEN isbreak := 2
  363.  
  364.               count := count + 2
  365.             ELSEIF InStr(man, '.IB ') = 0
  366.               laststyle := style
  367.               style     := italbold
  368.               setfontstyle(style)
  369.  
  370.               j := count + 1
  371.               WHILE memadr[j] = " " DO INC j
  372.               IF memadr[j] <> "\n" THEN isbreak := 2
  373.  
  374.               count := count + 3
  375.             ELSEIF InStr(man, '.IR ') = 0
  376.              laststyle := style
  377.               style     := ital
  378.               setfontstyle(style)
  379.  
  380.               j := count + 1
  381.               WHILE memadr[j] = " " DO INC j
  382.               IF memadr[j] <> "\n" THEN isbreak := 2
  383.  
  384.               count := count + 3
  385.  
  386.             -> PARA
  387.             ELSEIF InStr(man, '.IP') = 0
  388.               count := i
  389.               mem2[count2++] := "\n"
  390.               mem2[count2++] := "\t"
  391.               cchar := 1
  392.  
  393.             ELSE
  394.               mem2[count2++] := memadr[count++]
  395.               INC cchar
  396.             ENDIF
  397.  
  398.           CASE "L"
  399.             -> LINE BREAK
  400.             IF InStr(man, '.LP') = 0
  401.               mem2[count2++] := "\n"
  402.               mem2[count2++] := "\n"
  403.  
  404.               cchar := 0
  405.               count := i
  406.             ELSE
  407.               mem2[count2++] := memadr[count++]
  408.               INC cchar
  409.             ENDIF
  410.  
  411.           CASE "P"
  412.             -> PARA
  413.             IF InStr(man, '.PP') = 0
  414.               mem2[count2++] := "\n"
  415.               mem2[count2++] := "\n"
  416.  
  417.               cchar := 0
  418.               count := i
  419.             ELSEIF InStr(man, '.P') = 0
  420.               mem2[count2++] := "\n"
  421.               mem2[count2++] := "\n"
  422.  
  423.               cchar := 0
  424.               count := i
  425.             ELSE
  426.               mem2[count2++] := memadr[count++]
  427.               INC cchar
  428.             ENDIF
  429.  
  430.           CASE "R"
  431.             -> RESET MARGINS
  432.             IF InStr(man, '.RE') = 0
  433.               count := i
  434.             -> RESET MARGINS
  435.             ELSEIF InStr(man, '.RS') = 0
  436.               count := i
  437.             ELSE
  438.               mem2[count2++] := memadr[count++]
  439.               INC cchar
  440.             ENDIF
  441.  
  442.           CASE "s"
  443.             -> LINE BREAK
  444.             IF InStr(man, '.sp') = 0
  445.  
  446.               mem2[count2++] := "\n"
  447.               mem2[count2++] := "\n"
  448.               cchar := 0
  449.  
  450.               count := i
  451.             ELSE
  452.               mem2[count2++] := memadr[count++]
  453.               INC cchar
  454.             ENDIF
  455.  
  456.           CASE "S"
  457.             -> HEADER
  458.             IF InStr(man, '.SH ') = 0
  459.               mem2[count2++] := "\n"
  460.               cchar := 0
  461.  
  462.               mem2[count2++] := "\e"
  463.               mem2[count2++] := "["
  464.               mem2[count2++] := "4"
  465.               mem2[count2++] := "3"
  466.               mem2[count2++] := "m"
  467.  
  468.               isbreak := 1
  469.               count := count + 4
  470.             ELSEIF InStr(man, '.SS ') = 0
  471.               mem2[count2++] := "\n"
  472.               cchar := 0
  473.  
  474.               mem2[count2++] := "\e"
  475.               mem2[count2++] := "["
  476.               mem2[count2++] := "2"
  477.               mem2[count2++] := "m"
  478.  
  479.               isbreak := 1
  480.  
  481.               count := count + 4
  482.  
  483.             ELSEIF InStr(man, '.SM ') = 0
  484.               mem2[count2++] := "\n"
  485.               cchar := 0
  486.  
  487.               mem2[count2++] := "\e"
  488.               mem2[count2++] := "["
  489.               mem2[count2++] := "2"
  490.               mem2[count2++] := "m"
  491.  
  492.  
  493.               isbreak := 1
  494.  
  495.               count := count + 4
  496.             ELSE
  497.               mem2[count2++] := memadr[count++]
  498.               INC cchar
  499.             ENDIF
  500.  
  501.           CASE "T"
  502.             -> PARA
  503.             IF InStr(man, '.TP') = 0
  504.               mem2[count2++] := "\n"
  505.               cchar := 1
  506.  
  507.               count := i
  508.             -> UNKNOWN
  509.             ELSEIF InStr(man, '.TQ') = 0
  510.               mem2[count2++] := "\n"
  511.               cchar := 1
  512.  
  513.               count := i
  514.               isbreak := 1
  515.             ELSE
  516.               mem2[count2++] := memadr[count++]
  517.               INC cchar
  518.             ENDIF
  519.  
  520.           DEFAULT
  521.             mem2[count2++] := memadr[count++]
  522.             INC cchar
  523.  
  524.         ENDSELECT
  525.  
  526.  
  527.       DEFAULT
  528.  
  529.         mem2[count2++] := memadr[count++]
  530.         INC cchar
  531.  
  532.          -> WORDWRAP IF NECESSARY
  533.  
  534.         IF ww = TRUE
  535.           IF cchar >= wordwrap
  536.  
  537.             -> Find last space
  538.  
  539.             IF isspace(mem2[count2]) = TRUE
  540.               mem2[count2++] := "\n"
  541.               cchar := 0
  542.             ELSE
  543.               oldpos := count2
  544.               WHILE isspace(mem2[oldpos]) = FALSE
  545.                 mem2[oldpos+1] := mem2[oldpos]
  546.                 DEC oldpos
  547.              ->   mem2[oldpos+1] := mem2[oldpos]
  548.               ENDWHILE
  549.              -> DEC oldpos
  550.    ->           CopyMem(mem2 + oldpos, mem2 + oldpos + 1, count2 - oldpos)
  551.               mem2[oldpos] := "\n"
  552.               cchar := count2 - oldpos
  553.             ->  INC count2
  554.  
  555.  
  556.             ENDIF
  557.           ENDIF
  558.         ENDIF
  559.  
  560.  
  561.     ENDSELECT
  562.   ENDWHILE
  563.  
  564. ENDPROC mem2, count2
  565. -><
  566.  
  567. -> *** STANDARD PROCS FOR PLUGINS
  568.  
  569.  
  570. PROC em_begin(epo:PTR TO em_pluginobj)
  571.   DEF m2, l2
  572.   IF em_isdatatype(epo.buffer, epo.length)
  573.     RETURN "MEM", (epo.length * 2)
  574.   ELSE
  575.     RETURN FALSE
  576.   ENDIF
  577. ENDPROC
  578.  
  579. PROC em_main(epo:PTR TO em_pluginobj)
  580.   DEF m2, l2
  581.   m2, l2 := em_parsedata(epo)
  582.   epo.nlength := l2
  583.   RETURN TRUE
  584. ENDPROC
  585.  
  586. PROC em_end()      IS EMPTY
  587.  
  588. PROC em_info()     IS 'Troff2Text 1.03'
  589.  
  590. PROC em_pluginid() IS "FILE"
  591.  
  592. PROC em_format()   IS 'Troff'
  593.  
  594. PROC main()        IS EMPTY
  595.